package com.atguigu.juc.chap08;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolDemo {

    public static void main(String[] args) {

        // 任务过多时会被放入无界阻塞队列，容易引起内存溢出：因为底层使用的时LinkedBlockingQueue
        // 1、创建线程池对象：一池一堆线程
        // ExecutorService threadPool = Executors.newSingleThreadExecutor();
        // 2、创建线程池对象：固定线程池的线程数量：
        // ExecutorService threadPool = Executors.newFixedThreadPool(3);

        // 最大线程数是 Integer.MAX_VALUE，因此当任务过多时会创建过多的线程来处理任务，造成内存溢出
        // 3、创建线程池对象：线程的数量可以根据任务的数量和执行时间动态调整（遇强则强）：因为底层使用的是SynchronousQueue
        ExecutorService threadPool = Executors.newCachedThreadPool();

        try {
            for (int i = 0; i < 1000; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "开始执行业务逻辑");
                    try {
                        TimeUnit.MILLISECONDS.sleep(50);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.println(Thread.currentThread().getName() + "结束");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}